{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "#正则表达式\n",
    "#https://www.jb51.net/article/177521.htm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['ls@qq.com', 'ls@q师德师风.com']"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#1.  .*?（匹配所有内容）\n",
    "\n",
    "#例如：'<title>(.*?)</title>'   将网页的标题爬取下来。\n",
    "\n",
    "str2='<title>ls@qq.com</title>sds<title>ls@q师德师风.com</title>'\n",
    "pattern=re.compile(r'<title>(.*?)</title>')\n",
    "result=re.findall(pattern,str2)\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['123@qq.com']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#2.  \\w 单词字符[A-Za-z0-9_]\n",
    "str='Ryan Whybrew commented on your 123@qq.com status.Ryan wrote:\"turd ferguson or butt horn.\"'\n",
    "pattern=re.compile(r'\\w+@\\w+\\.com')\n",
    "result=re.findall(pattern,str)\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['heuet.']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#   \\w+@(\\w+\\.)*\\w+\\.com 模式就更厉害了，\" * \" 可以匹配0次或无限次。\n",
    "import re\n",
    "str1='Ryan Whybrew commented on your hello123@heuet.edu.com status.Ryan wrote:\"turd ferguson or butt horn.\"'\n",
    "pattern1=re.compile(r'\\w+@(\\w+\\.)*\\w+\\.com')\n",
    "res=re.findall(pattern1,str1)\n",
    "res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#3.  \n",
    "import re\n",
    "str='$ssds#,sdf$sddd'\n",
    "pattern=re.compile(r'$(.*?)#')\n",
    "res=re.findall(pattern,str)\n",
    "res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "Create by 2018-05-20\n",
    "\n",
    "@author: Shiyipaisizuo\n",
    "\"\"\"\n",
    "\n",
    "from numpy import *\n",
    "import re\n",
    "import operator\n",
    "\n",
    "\n",
    "# 加载数据\n",
    "\n",
    "def load_data_set():\n",
    "    #we define Data，six data about text\n",
    "    posting_list = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],\n",
    "                    ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],\n",
    "                    ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],\n",
    "                    ['stop', 'posting', 'stupid', 'worthless', 'garbage'],\n",
    "                    ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],\n",
    "                    ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]\n",
    "\n",
    "    # 1代表侮辱性文字， 0代表正常言论\n",
    "    #first have no problem\n",
    "    #second have proble，and soso\n",
    "    class_vec = [0, 1, 0, 1, 0, 1]\n",
    "\n",
    "    return posting_list, class_vec\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def creat_identify(data):\n",
    "    voc_list=set([])\n",
    "    for i in data:\n",
    "        voc_list=voc_list|set(i)\n",
    "    return list(voc_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def set_of_word(voc_list,voc_doc):\n",
    "    voc_print=[0]*len(voc_list)\n",
    "    for i in voc_doc:\n",
    "        if i in voc_list:\n",
    "            voc_print[voc_list.index(i)]+=1\n",
    "    return voc_print\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "data,label=load_data_set()\n",
    "voc_list=creat_identify(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0]\n"
     ]
    }
   ],
   "source": [
    "voc_print=set_of_word(voc_list,['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'])\n",
    "print(voc_print)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0]]\n"
     ]
    }
   ],
   "source": [
    "text_after=[]\n",
    "for i in data:\n",
    "    text_after.append(set_of_word(voc_list,i))\n",
    "print(((text_after)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([-2.56494936, -1.87180218, -3.25809654, -2.56494936, -2.56494936,\n",
       "        -2.56494936, -2.56494936, -2.56494936, -2.56494936, -2.56494936,\n",
       "        -3.25809654, -3.25809654, -3.25809654, -2.56494936, -2.56494936,\n",
       "        -2.15948425, -2.56494936, -3.25809654, -3.25809654, -2.56494936,\n",
       "        -2.56494936, -3.25809654, -2.56494936, -2.56494936, -2.56494936,\n",
       "        -2.56494936, -3.25809654, -3.25809654, -3.25809654, -2.56494936,\n",
       "        -2.56494936, -3.25809654]),\n",
       " array([-3.04452244, -3.04452244, -2.35137526, -3.04452244, -3.04452244,\n",
       "        -3.04452244, -3.04452244, -3.04452244, -3.04452244, -2.35137526,\n",
       "        -1.94591015, -2.35137526, -2.35137526, -3.04452244, -3.04452244,\n",
       "        -2.35137526, -3.04452244, -2.35137526, -2.35137526, -3.04452244,\n",
       "        -2.35137526, -2.35137526, -3.04452244, -3.04452244, -3.04452244,\n",
       "        -3.04452244, -2.35137526, -1.65822808, -2.35137526, -3.04452244,\n",
       "        -1.94591015, -2.35137526]),\n",
       " 0.5)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[[0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], \n",
    " [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], \n",
    " [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0], \n",
    " [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0], \n",
    " [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0], \n",
    " [0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]\n",
    "def train(text_after,label):\n",
    "    num=len(text_after)\n",
    "    num_words=len(text_after[0])\n",
    "    p_abus=sum(label)/float(num)\n",
    "    p0_np=ones(num_words)\n",
    "    p0_num=2.0\n",
    "    p1_np=ones(num_words)\n",
    "    p1_num=2.0\n",
    "    for i in range(num):\n",
    "        if label[i]==0:\n",
    "            p0_np=p0_np+text_after[i]\n",
    "            p0_num=p0_num+sum(text_after[i])\n",
    "        else:\n",
    "            p1_np=p1_np+text_after[i]\n",
    "            p1_num=p1_num+sum(text_after[i])\n",
    "#     print(p0_np)\n",
    "    p1=log(p1_np/p1_num)\n",
    "    p0=log(p0_np/p0_num)\n",
    "    return p0,p1,p_abus\n",
    "train(text_after,label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-14-94db70ccc2c5>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-14-94db70ccc2c5>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m    [1. 1. 2. 1. 1. 2. 2. 2. 2. 1. 2. 1. 2. 2. 2. 2. 2. 1. 2. 4. 2. 1. 1. 2.\u001b[0m\n\u001b[1;37m         ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "[1. 1. 2. 1. 1. 2. 2. 2. 2. 1. 2. 1. 2. 2. 2. 2. 2. 1. 2. 4. 2. 1. 1. 2.\n",
    " 2. 3. 1. 2. 2. 2. 1. 2.]\n",
    "[-3.25809654 -3.25809654 -2.56494936 -3.25809654 -3.25809654 -2.56494936\n",
    " -2.56494936 -2.56494936 -2.56494936 -3.25809654 -2.56494936 -3.25809654\n",
    " -2.56494936 -2.56494936 -2.56494936 -2.56494936 -2.56494936 -3.25809654\n",
    " -2.56494936 -1.87180218 -2.56494936 -3.25809654 -3.25809654 -2.56494936\n",
    " -2.56494936 -2.15948425 -3.25809654 -2.56494936 -2.56494936 -2.56494936\n",
    " -3.25809654 -2.56494936] [-2.35137526 -2.35137526 -3.04452244 -1.65822808 -2.35137526 -3.04452244\n",
    " -3.04452244 -3.04452244 -3.04452244 -2.35137526 -3.04452244 -2.35137526\n",
    " -3.04452244 -3.04452244 -2.35137526 -2.35137526 -1.94591015 -2.35137526\n",
    " -3.04452244 -3.04452244 -3.04452244 -2.35137526 -2.35137526 -3.04452244\n",
    " -3.04452244 -2.35137526 -1.94591015 -3.04452244 -3.04452244 -3.04452244\n",
    " -2.35137526 -3.04452244] 0.5\n",
    "\n",
    "[0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def classify(text_fun,p_abus,p0,p1):\n",
    "    p_0=sum(text_fun*p0)+log(p_abus)\n",
    "    p_1=sum(text_fun*p1)+log(1.0-p_abus)\n",
    "#     print('p0:',p_0,'p1:',p_1)\n",
    "    if p_0>=p_1:\n",
    "        return 0\n",
    "    if p_0<p_1:\n",
    "        return 1\n",
    "p0,p1,p_abus=train(text_after,label)\n",
    "text_fun=[0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]\n",
    "classify(text_fun,p_abus,p0,p1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "0\n",
      "1\n",
      "0\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "for i in text_after:\n",
    "    print(classify(i,p_abus,p0,p1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n"
     ]
    }
   ],
   "source": [
    "def test():\n",
    "    #得到数据和标签\n",
    "    data,label=load_data_set()\n",
    "    #得到列表所有的单词\n",
    "    voc_list=creat_identify(data)\n",
    "    text_after=[]\n",
    "    for i in data:\n",
    "        text_after.append(set_of_word(voc_list,i))\n",
    "    p0,p1,p_abus=train(text_after,label)\n",
    "    test_1=['stupid', 'garbage']\n",
    "    print(classify(array(set_of_word(voc_list,test_1)),p_abus,p0,p1))\n",
    "test()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['this',\n",
       " 'book',\n",
       " 'the',\n",
       " 'best',\n",
       " 'book',\n",
       " 'python',\n",
       " 'm_l',\n",
       " 'have',\n",
       " 'ever',\n",
       " 'laid',\n",
       " 'eyes',\n",
       " 'upon']"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 切割分类文本\n",
    "def text_parse(big_string):\n",
    "    list_of_tokens = re.split('\\W+', big_string)\n",
    "\n",
    "    return [tok.lower() for tok in list_of_tokens if len(tok) > 2]\n",
    "mySent='This book is the best book on Python or M_L. I !!!!have ever@@@ laid eyes upon.'\n",
    "text_parse(mySent)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "def zly_test(train_num_zly=40):\n",
    "    voc_list=[]\n",
    "    label=[]\n",
    "    voc_text=[]\n",
    "    #得到所有的数据（已经切分好的数据）和标签\n",
    "    for i in range(1,26):\n",
    "        text_1=text_parse(open('email/spam/%d.txt'%i).read())\n",
    "        voc_list.append(text_1)\n",
    "        label.append(1)\n",
    "        \n",
    "        text_0=text_parse(open('email/ham/%d.txt'%i).read())\n",
    "        voc_list.append(text_0)\n",
    "        label.append(0)\n",
    "#     print(len(voc_list))\n",
    "    #得到所有的不重复的单词列表\n",
    "    voc_list_after=creat_identify(voc_list)\n",
    "    #得到所有单词的袋装模型\n",
    "    fun_zly=5\n",
    "    aver_error=0.0\n",
    "    for i in range(fun_zly):\n",
    "        test_index=[]\n",
    "        train_index=list(range(1,51))\n",
    "        train_matrix=[]\n",
    "        train_label=[]\n",
    "        while len(train_index)!=train_num_zly:\n",
    "            t=random.randint(1,51)\n",
    "            if t in train_index:\n",
    "                train_index.remove(t)\n",
    "                test_index.append(t)\n",
    "#         print('len(train_index):',len(train_index))\n",
    "        for j in train_index:\n",
    "#             print(j,end= ' ')\n",
    "            j=j-1\n",
    "            train_matrix.append(set_of_word(voc_list_after,voc_list[j]))\n",
    "            train_label.append(label[j])\n",
    "        \n",
    "        p0,p1,p_abus=train(train_matrix,train_label)\n",
    "        zly_num=0\n",
    "        error=0\n",
    "        for k in test_index:\n",
    "            k=k-1\n",
    "            zly_num+=1\n",
    "            if classify(array(set_of_word(voc_list_after,voc_list[k])),p_abus,p0,p1)!=label[k]:\n",
    "                error+=1\n",
    "#         print('error:',error)\n",
    "        aver_error+=float(error)/float(zly_num)\n",
    "    return aver_error/fun_zly\n",
    "    \n",
    "    \n",
    "    \n",
    "#     for i in voc_list:\n",
    "#         voc_text.append(set_of_word(voc_list_after,i))\n",
    "#     p0,p1,p_abus=train(voc_text,label)\n",
    "    \n",
    "#     test_zly=text_parse(open('email/ham/25.txt').read())\n",
    "#     print(test_zly)\n",
    "#     print(classify((set_of_word(voc_list_after,test_zly)),p_abus,p0,p1))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "last=[]\n",
    "for i in range(20,45):\n",
    "    last.append(zly_test(train_num_zly=i))\n",
    "plt.plot(np.array(last))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n",
      "2\n",
      "4\n",
      "[1, 3]\n"
     ]
    }
   ],
   "source": [
    "test=[]\n",
    "for i in range(1,6):\n",
    "    test.append(i)\n",
    "# print(test)\n",
    "while len(test)!=2:\n",
    "    t=random.randint(1,6)\n",
    "    print(t)\n",
    "    if t in test:\n",
    "        test.remove(t)\n",
    "print(test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t=random.randint(1,6)\n",
    "t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
